BOJ_14890_경사로
열과 행을 탐색하며 경사로를 설치할 수 있는지 확인하는 구현 문제
반복되는 작업이 많기 때문에 메소드로 빼서 간결하게 작성하는 게 좋다
package BJO;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.stream.Stream;
public class BJO_14890_경사로 {
static int[][] map;
static int N;
static int L;
static boolean[][] isThereStair;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
map = new int[N][N];
isThereStair = new boolean[N][N];
for (int i = 0; i < N; i++) {
map[i] = Stream.of(br.readLine().split(" ")).mapToIntparseInt).toArray(;
}
int cnt = 0;
for (int i = 0; i < N; i++) {
if (findRoad(i, 0, false)) {
cnt++;
}
if (findRoad(0, i, true)) {
cnt++;
}
}
System.out.println(cnt);
}
static boolean findRoad(int y, int x, boolean flag) {
int[] height = new int[N];
boolean[] visited = new boolean[N];
for (int i = 0; i < N; i++) {
if (!flag) {
height[i] = map[y][i];
} else {
height[i] = map[i][x];
}
}
for (int i = 0; i < N - 1; i++) {
if (height[i] - 1 == height[i + 1]) {
for (int j = i + 1; j < i + 1 + L; j++) {
if (j >= N || visited[j] || height[i + 1] != height[j]) {
return false;
}
visited[j] = true;
}
} else if (height[i] + 1 == height[i + 1]) {
for (int j = i; j > i - L; j--) {
if (j < 0 || visited[j] || height[i] != height[j]) {
return false;
}
visited[j] = true;
}
} else if (height[i] != height[i + 1]) {
return false;
}
}
return true;
}
}